package cn.rengy.web.framework.jwt;

import java.security.Key;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;

public class JwtUtils {
	private static Logger logger = LoggerFactory.getLogger(JwtUtils.class);
	
    
    //private static SignatureAlgorithm signatureAlgorithm=SignatureAlgorithm.HS256;//指定签名的时候使用的签名算法

    public static String create(Claims claims,Key key){
        
        JwtBuilder jwtBuilder = Jwts.builder();
        jwtBuilder.setClaims(claims);
        jwtBuilder.signWith(key);//签名秘钥
        return jwtBuilder.compact();
        
        
        /**
         * https://tools.ietf.org/html/rfc7519#section-4.1
         * 根据JWT的标准，这些claims可以分为以下三种类型： 
a. Reserved claims（保留），它的含义就像是编程语言的保留字一样，属于JWT标准里面规定的一些claim。JWT标准里面定好的claim有：

iss(Issuser)：代表这个JWT的签发主体；
sub(Subject)：代表这个JWT的主体，即它的所有人；
aud(Audience)：代表这个JWT的接收对象；
exp(Expiration time)：是一个时间戳，代表这个JWT的过期时间；
nbf(Not Before)：是一个时间戳，代表这个JWT生效的开始时间，意味着在这个时间之前验证JWT是会失败的；
iat(Issued at)：是一个时间戳，代表这个JWT的签发时间；
jti(JWT ID)：是JWT的唯一标识。
         */
        /*
        //必须先设置claims 一旦写在标准的声明赋值之后，就是覆盖了那些标准的声明的
        Map<String,Object> claims=jwtEntity.getClaims();
        if(claims!=null&&!claims.isEmpty()) {
        	jwtBuilder.setClaims(claims);
        }
        String id=jwtEntity.getId();
        if (StringUtils.isNotEmpty(id)) {
            jwtBuilder.setId(id);
        }
        Date notBefore=jwtEntity.getNotBefore();
        if(notBefore!=null) {
        	jwtBuilder.setNotBefore(notBefore);
        }
        String audience=jwtEntity.getAudience();
        if(StringUtils.isNotEmpty(audience)) {
        	jwtBuilder.setAudience(audience);
        }
        String subject=jwtEntity.getSubject();
        if (StringUtils.isNotEmpty(subject)) {
            jwtBuilder.setSubject(subject);
        }
        String issuer=jwtEntity.getIssuer();
        if (StringUtils.isNotEmpty(issuer)) {
            jwtBuilder.setIssuer(issuer);
        }
        Date issuedAt=jwtEntity.getIssuedAt();
        if(issuedAt!=null) {
        	jwtBuilder.setIssuedAt(issuedAt);
        }
        Date expiration=jwtEntity.getExpiration();
        if(expiration!=null) {
        	jwtBuilder.setExpiration(expiration);
        }*/
    }
    

    
    public static Claims verify(String jwt,Key key) {
        Claims claims = Jwts.parser()
        	       .setSigningKey(key)
        	       .parseClaimsJws(jwt).getBody();
        return claims;
        
    }
    

}
